package br.ucb.servlets;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.ucb.dao.EntidadeDAO;
import br.ucb.entidade.Entidade;
import br.ucb.excecao.RegrasException;
import br.ucb.service.EntidadeService;

/**
 * Todas as servlets extendem esta abstrata.
 * Sobrescrevem apenas o m�todo processaRequisicao para fazer cumprir suas obriga��es.
 * Passam como par�metro a entidade, service e dao espec�ficas.
 */
public abstract class AbstractPapirosServlet_1<E extends Entidade, S extends EntidadeService<E,D>, D extends EntidadeDAO<E>> extends HttpServlet{
	
	private static final long serialVersionUID = 1L;
	
	protected S entidadeService;
	protected E entidade;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		processaRequisicao(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		processaRequisicao(req, resp);
	}
	
	protected void forward(HttpServletRequest req, HttpServletResponse resp, String destino)throws ServletException,IOException{
		RequestDispatcher rd = req.getRequestDispatcher(destino);
		rd.forward(req, resp);
	}
	
	protected Boolean insert(E entidade, HttpServletRequest req){
		try{
			getEntidadeService().insert(entidade);
			setSucesso(req);
			return true;
		}catch(RegrasException e){
			setMensagem(e.getMessage(), req);
		}
		return false;
	}
	
	protected Boolean remove(E entidade, HttpServletRequest req){
		try{
			getEntidadeService().remove(entidade);
			setSucesso(req);
			return true;
		}catch(RegrasException e){
			setMensagem(e.getMessage(), req);
		}
		return false;
	}
	
	protected Boolean update(E entidade, HttpServletRequest req){
		try{
			getEntidadeService().update(entidade);
			setSucesso(req);
			return true;
		}catch(RegrasException e){
			setMensagem(e.getMessage(), req);
		}
		return false;
	}
	
	protected List<E> find(E entidade, HttpServletRequest req){
		try{
			return getEntidadeService().find(entidade);
		}catch(RegrasException e){
			setMensagem(e.getMessage(), req);
		}
		return null;
	}

	protected E findByKey(E entidade, HttpServletRequest req){
		try{
			return getEntidadeService().findByKey(entidade);
		}catch(RegrasException e){
			setMensagem(e.getMessage(), req);
		}
		return null;
	}

	public void setEntidadeService(S entidadeService) {
		this.entidadeService = entidadeService;
	}
	
	public S getEntidadeService() {
		return entidadeService;
	}
	
	public void setEntidade(E entidade) {
		this.entidade = entidade;
	}
	
	public E getEntidade(){
		return entidade;
	}
	
	public void setSucesso(HttpServletRequest req){
		setMensagem("Opera��o realizada com sucesso.",req);
	}

	public void setMensagem(String mensagem, HttpServletRequest req) {
		req.setAttribute("mensagem", mensagem);
	}

	protected abstract void processaRequisicao(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException;
}
